package com.zb.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zb.entity.GoodsSpecIdVo;
import com.zb.entity.ZjCode;
import com.zb.extend.CodeExtend;
import com.zb.result.PageUtil;
import com.zb.service.ZjCodeUserRegisterService;
import com.zb.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * <p>
 * 编码表 Mapper 接口
 * </p>
 *
 * @author WEN
 * @since 2023-08-23
 */
@Repository
public interface ZjCodeMapper extends BaseMapper<ZjCode> {

    /**
     * 查询编码列表
     * @param custAccId 商家ID
     * @param goodsIds 查询条件：商品ID集合
     * @param selectVo 查询条件
     * @return
     */
    List<CodeListVo> getList(@Param("custAccId") Long custAccId, @Param("goodsIds") List<Long> goodsIds, @Param("selectVo") CodeListSelectVo selectVo);

    /**
     * 查询编码列表总记录数
     * @param custAccId 商家ID
     * @param goodsIds 查询条件：商品ID集合
     * @param selectVo 查询条件
     * @return
     */
    long getListCont(@Param("custAccId") Long custAccId, @Param("goodsIds") List<Long> goodsIds, @Param("selectVo") CodeListSelectVo selectVo);

    /**
     * 根据编码ID获取编码详情
     * @param id 编码ID
     * @return
     */
    CodeExtend getDetailById(Long id);

    /**
     * 根据编码ID查询已激活的编码
     * @param ids 编码ID
     * @return
     */
    List<String> getActivCodeByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码ID获取表类型
     * @param id 编码ID
     * @return
     */
    Integer getTableTypeById(Long id);

    /**
     * 分页获取批次ID
     * @param custAccId 商家ID
     * @param goodsIds 商品ID集合
     * @param page 当前页码
     * @param limit 每页显示数量
     * @return
     */
    List<Long> pageGetBatchIds(@Param("custAccId") Long custAccId, @Param("goodsIds") List<Long> goodsIds, @Param("page") Long page, @Param("limit") Long limit);

    /**
     * 根据批次ID查询编码激活数量
     * @param batchIds 编码批次ID集合
     * @return
     */
    List<CodeBatchListVo> getActivaCountByBatchIds(@Param("batchIds") List<Long> batchIds);

    /**
     * 根据批次ID获取编码列表
     * @param batchId 批次ID
     * @param pageUtil
     * @return
     */
    List<CodeExtend> getCodeList(@Param("batchId") Long batchId, @Param("pageUtil") PageUtil pageUtil);

    /**
     * 根据批次ID获取编码列表总记录数
     * @param batchId 批次ID
     * @return
     */
    long getCodeListCount(@Param("batchId") Long batchId);

    /**
     * 根据编码批次ID查询编码关联信息
     * @param codeBatchIds 编码批次ID集合
     * @return
     */
    List<CodeRelateoinInfoVo> checkCodeRelationInfoForDeleteByBatchIds(@Param("codeBatchIds") List<Long> codeBatchIds);

    /**
     * 根据编码批次ID查询编码ID
     * @param codeBatchId 编码批次ID
     * @return
     */
    List<Long> getIdByBatchId(@Param("codeBatchId") Long codeBatchId);

    /**
     * 根据编码ID查询检查是否编码有关联信息
     * @param ids
     * @return
     */
    List<CodeRelateoinInfoVo> checkCodeRelationInfoByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码ID获取商品信息
     * @param ids
     * @return
     */
    List<ZjCode> getGoodsByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码批次ID获取编码总数量
     * @param batchId 批次ID
     * @return
     */
    long getCodeBatchExportTotalByBatchId(@Param("batchId") Long batchId);

    /**
     * 根据批次ID分页获取编码信息
     * @param batchId 批次ID
     * @param page 当面页码
     * @param limit 查询的数量
     * @return
     */
    List<ZjCode> getCodeBatchExportByBatchId(@Param("batchId") Long batchId, @Param("page") int page, @Param("limit") int limit);

    /**
     * 根据商品ID & 商品规格ID查询存在关联的商品ID集合
     * @param type 商品类型：1-成品，2-备件
     * @param goodsId 商品ID
     * @param goodsSpecIds 商品规格ID
     * @return
     */
    List<Long> getGoodsSpecId(@Param("type") Integer type, @Param("goodsId") Long goodsId, @Param("goodsSpecIds") List<Long> goodsSpecIds);

    /**
     * 根据商品ID查询存在关联的商品ID集合
     * @param type 商品类型：1-成品，2-备件
     * @param goodsIds 商品ID集合
     * @return
     */
    List<Long> getGoodsId(@Param("type") Integer type, @Param("goodsIds") List<Long> goodsIds);

    /**
     * 根据ID查询信息
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getRegisterByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码ID获取编码信息
     * @param ids
     * @return
     */
    List<ZjCode> getSecurityCodeByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码ID获取批次编码ID信息
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getBatchIdByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码批次ID获取编码ID
     * @param batchIds 编码批次ID
     * @return
     */
    List<Long> getIdByBatchIds(@Param("batchIds") List<Long> batchIds);

    /**
     * 根据编码批次ID获取关联工单的编码ID
     * @param batchIds 编码批次ID
     * @return
     */
    List<Long> getRelationWorkByBatchIds(@Param("batchIds") List<Long> batchIds);

    /**
     * 根据编码ID获取关联工单的编码ID
     * @param ids 编码ID
     * @return
     */
    List<Long> getRelationWorkByIds(@Param("ids") List<Long> ids);

    /**
     * 根据批次商品表ID获取编码信息
     * @param batchGoodsId 批次商品ID
     * @param page 当前页码
     * @param limit 每页显示数量
     * @return
     */
    List<ZjCode> getByBatchGoodsId(@Param("batchGoodsId") Long batchGoodsId, @Param("page") long page, @Param("limit") long limit);

    /**
     * 获取未登记商品编码（成品）
     * @param custAccId 商家ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    List<ZjCode> getNotRegisterCode(@Param("custAccId") Long custAccId, @Param("codeSelectVo") OrderCodeSelectVo codeSelectVo);

    /**
     * 获取未登记商品编码总数量（成品）
     * @param custAccId 商家ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    long getNotRegisterCodeCount(@Param("custAccId") Long custAccId, @Param("codeSelectVo") OrderCodeSelectVo codeSelectVo);

    /**
     * 获取已登记商品编码总数量（成品）
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param goodsIds 商品ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    List<CodeRegisterVo> getRegisterCode(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("goodsIds") List<Long> goodsIds, @Param("codeSelectVo") OrderCodeSelectVo codeSelectVo);

    /**
     * 获取已登记商品编码总数量总记录数（成品）
     * @param custAccId 商家ID
     * @param userId 客户ID
     * @param goodsIds 商品ID
     * @param codeSelectVo 搜索条件
     * @return
     */
    long getRegisterCodeCount(@Param("custAccId") Long custAccId, @Param("userId") Long userId, @Param("goodsIds") List<Long> goodsIds, @Param("codeSelectVo") OrderCodeSelectVo codeSelectVo);

    /**
     * 根据编码ID获取用户编码登记信息
     * @param ids 编码ID
     * @return
     */
    List<ZjCode> getUserCodeRegisterByIds(@Param("ids") List<Long> ids);

    /**
     * 根据编码ID获取用户编码信息
     * @param id 编码ID
     * @return
     */
    ZjCode getUserCodeRegisterById(@Param("id") Long id);

    /**
     * 根据防伪/仓库编码获取编码ID，不支持模糊查询
     * @param custAccId 商家ID
     * @param code 防伪/仓库编码
     * @return 编码ID
     */
    Long getIdByCodeOrStoreCode(@Param("custAccId") Long custAccId, @Param("code") String code);

    /**
     * 根据编码ID获取商品ID
     * @param id 编码ID
     * @return
     */
    ZjCode getGoodsById(@Param("id") Long id);

    /**
     * 根据防伪编码获取编码信息
     * @param custAccId 商家ID
     * @param securityCode 防伪编码
     * @return
     */
    ZjCode getByCode(@Param("custAccId") Long custAccId, @Param("securityCode") String securityCode);

    /**
     * 根据编码校验并获取存在的编码ID
     * @param custAccId 商家ID
     * @param codes 编码
     * @return
     */
    List<ZjCode> checkByCodes(@Param("custAccId") Long custAccId, @Param("codes") List<String> codes);

    /**
     * 获取在库的一物一码
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<ZjCode> getInStoreCodeList(@Param("custAccId") Long custAccId, @Param("searchVo") CodeInStoreListSearchVo searchVo);

    /**
     * 获取在库的一物一码总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getInStoreCodeListCount(@Param("custAccId") Long custAccId, @Param("searchVo") CodeInStoreListSearchVo searchVo);

    /**
     * 获取未出入库的一物一码
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    List<ZjCode> getStoreCodeList(@Param("custAccId") Long custAccId, @Param("searchVo") CodeInStoreListSearchVo searchVo);

    /**
     * 获取未出入库的一物一码总记录数
     * @param custAccId 商家ID
     * @param searchVo 搜索条件
     * @return
     */
    long getStoreCodeListCount(@Param("custAccId") Long custAccId, @Param("searchVo") CodeInStoreListSearchVo searchVo);

    /**
     * 查询一物一码是否重复
     * @param custAccId 商家ID
     * @param securityCode 一物一码
     * @return
     */
    Integer existBySecurityCode(@Param("custAccId") Long custAccId, @Param("securityCode") String securityCode);
}
